package cn.sys.aspect;

import cn.sys.domain.Menu;
import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

/**
 * redis切面类
 * @author Mxb
 * @version 1.0
 * @date 2020/5/27 15:54
 */
//@Component
//@Aspect
//@EnableAspectJAutoProxy
public class CacheAspect {
    @Autowired
    private JedisPool jedisPool;

    private static final String ALL_MENU_LABEL = "load-left-menu-data";

    // 切入点(非常重要)
    @Pointcut("execution(* cn.sys.service.impl.MenuServiceImpl.queryAllMenu(*))")
    public void menuQueryPc() {
    }
    // 环绕通知
    @Around(value = "menuQueryPc()")
    public Object cache(ProceedingJoinPoint point) {

        Jedis jedis = jedisPool.getResource();
        // 如果redis数据库中存在
        if (jedis.exists(ALL_MENU_LABEL)) {
            //
            System.out.println("*****从redis数据库中取菜单数据*******");
            String menuJson = jedis.get(ALL_MENU_LABEL);
            // 将json 转换为 menu集合对象
            List<Menu> menu = com.alibaba.fastjson.JSON.parseArray(menuJson, Menu.class);
            // 返回menu
            return menu;
        }
        Object result = null;
        try {
            System.out.println("执行真实方法的调用，从数据库中取数据------");
            // 在此实现了真实方法的调用
            result = point.proceed(point.getArgs());
            // 转换数据 转为string类型
            String menu = JSON.toJSONString(result);
            // 将菜单数据放入到redis 数据库中
            jedis.set(ALL_MENU_LABEL,menu);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        // 返回菜单集合
        return result;
    }
}
